var initFn = (function(){
    let fn = (first, last, ...args) => {
        console.log(first);
        console.log(last);
        console.log(args);
    }

    fn(1, 2, 3, 4, 5);
    /**
     * 箭头函数4特点
     * 1、箭头函数的this指向由外层函数作用域或全局作用域决定的
     * 2、箭头函数不能作为构造函数来使用
     * 3、箭头函数没有arguments对象，用rest（拓展运算符）替代
     * 4、yield命令不能生效，在generator函数中
     */
    // 箭头函数的this指向有外层函数作用域或全局作用域决定的
    function foo(){
        return (a) => {
            console.log(this.a);
        }
    }

    var obj1 = {a: 2};
    var obj2 = {a: 3};
    var bar = foo.call(obj1);
    bar.call(obj2); // 2

    const person = {
        eat(){
            console.log(this); // person
        },
        drink:() => {
            // console.log(this); // window
        }
    }

    person.eat();
    person.drink();

    (function(){
        function Button(){
            this.button = document.getElementById('button');
        }

        Button.prototype = {
            init(){
                this.bindEvent();
            },
            bindEvent(){
                this.button.addEventListener('click', this.clickBtn.bind(this), false);
            },
            clickBtn(){
                console.log(this);
            }
        }
        new Button().init();
    });

    function foo(){
        return () => {
            return () => {
                return ()=> {
                    console.log('id', this.id);
                }
            }
        }
    }

    var f = foo.call({id: 1});
    f.call({id: 2})()();
    f().call({id: 3})();
    f()().call({id: 4});

    // 箭头函数不能作为构造函数来使用

    // 箭头函数不存在arguments
    // var test = () => {
    //     console.log(arguments); // 报错
    // }
    // test(1, 2, 3);

    function foo1(){
        console.log(arguments);
        setTimeout(() => {
            console.log(arguments);
        })
    }

    foo1(1, 2, 3, 4, 5);

    // 闭包：一个函数的执行，导致另一个函数的定义
});

var initNotJianTou = (function(){
    // 不适合使用箭头函数
    // 函数声明，执行语句比较多，还需要用到递归，需要引用函数名，事件绑定，解绑定

    
});
var initParam = function(){
    initFn();
    initNotJianTou();
}

initParam();